]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
shell/screenshot: Throw error on failure
authorFlorian Müllner <fmuellner@gnome.org>
Tue, 24 Mar 2020 06:15:26 +0000 (07:15 +0100)
committerCarlos Garnacho <mrgarnacho@gmail.com>
Tue, 24 Mar 2020 11:29:53 +0000 (11:29 +0000)
Commit da537cda43 moved the Shell.Screenshot API to GIO's async pattern,
but we never set the GError passed to the *_finish() functions and only
indicate failure by returning FALSE.

The expected behavior is to throw an error in that situation, so make sure
we do that.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1123

js/ui/screenshot.js
src/shell-screenshot.c

index 78afc4ae47b3f2f04ab2f3e323034046ef383bef..7aed8d01b493c0ca91e4b9549d22c06a8780d8de 100644 (file)
@@ -113,16 +113,14 @@ var ScreenshotService = class {
         return [null, null];
     }
 
-    _onScreenshotComplete(result, area, stream, file, flash, invocation) {
-        if (result) {
-            if (flash) {
-                let flashspot = new Flashspot(area);
-                flashspot.fire(() => {
-                    this._removeShooterForSender(invocation.get_sender());
-                });
-            } else {
+    _onScreenshotComplete(area, stream, file, flash, invocation) {
+        if (flash) {
+            let flashspot = new Flashspot(area);
+            flashspot.fire(() => {
                 this._removeShooterForSender(invocation.get_sender());
-            }
+            });
+        } else {
+            this._removeShooterForSender(invocation.get_sender());
         }
 
         stream.close(null);
@@ -136,7 +134,7 @@ var ScreenshotService = class {
             clipboard.set_content(St.ClipboardType.CLIPBOARD, 'image/png', bytes);
         }
 
-        let retval = GLib.Variant.new('(bs)', [result, filenameUsed]);
+        let retval = GLib.Variant.new('(bs)', [true, filenameUsed]);
         invocation.return_value(retval);
     }
 
@@ -178,12 +176,13 @@ var ScreenshotService = class {
         screenshot.screenshot_area(x, y, width, height, stream,
             (o, res) => {
                 try {
-                    let [result, area] =
+                    let [success_, area] =
                         screenshot.screenshot_area_finish(res);
                     this._onScreenshotComplete(
-                        result, area, stream, file, flash, invocation);
+                        area, stream, file, flash, invocation);
                 } catch (e) {
-                    invocation.return_gerror(e);
+                    this._removeShooterForSender(invocation.get_sender());
+                    invocation.return_value(new GLib.Variant('(bs)', [false, '']));
                 }
             });
     }
@@ -201,12 +200,13 @@ var ScreenshotService = class {
         screenshot.screenshot_window(includeFrame, includeCursor, stream,
             (o, res) => {
                 try {
-                    let [result, area] =
+                    let [success_, area] =
                         screenshot.screenshot_window_finish(res);
                     this._onScreenshotComplete(
-                        result, area, stream, file, flash, invocation);
+                        area, stream, file, flash, invocation);
                 } catch (e) {
-                    invocation.return_gerror(e);
+                    this._removeShooterForSender(invocation.get_sender());
+                    invocation.return_value(new GLib.Variant('(bs)', [false, '']));
                 }
             });
     }
@@ -224,12 +224,13 @@ var ScreenshotService = class {
         screenshot.screenshot(includeCursor, stream,
             (o, res) => {
                 try {
-                    let [result, area] =
+                    let [success_, area] =
                         screenshot.screenshot_finish(res);
                     this._onScreenshotComplete(
-                        result, area, stream, file, flash, invocation);
+                        area, stream, file, flash, invocation);
                 } catch (e) {
-                    invocation.return_gerror(e);
+                    this._removeShooterForSender(invocation.get_sender());
+                    invocation.return_value(new GLib.Variant('(bs)', [false, '']));
                 }
             });
     }
index 4cc65bd7713cdc951456ded318a6dc46dbe70439..e60d5891b11bd62f226f35b2ad0d5a7313f9bb21 100644 (file)
@@ -87,12 +87,12 @@ write_screenshot_thread (GTask        *result,
                          gpointer      task_data,
                          GCancellable *cancellable)
 {
-  cairo_status_t status;
   ShellScreenshot *screenshot = SHELL_SCREENSHOT (object);
   ShellScreenshotPrivate *priv;
   g_autoptr (GOutputStream) stream = NULL;
   g_autoptr(GdkPixbuf) pixbuf = NULL;
   g_autofree char *creation_time = NULL;
+  GError *error = NULL;
 
   g_assert (screenshot != NULL);
 
@@ -109,15 +109,15 @@ write_screenshot_thread (GTask        *result,
   if (!creation_time)
     creation_time = g_date_time_format (priv->datetime, "%FT%T%z");
 
-  if (gdk_pixbuf_save_to_stream (pixbuf, stream, "png", NULL, NULL,
-                                 "tEXt::Software", "gnome-screenshot",
-                                 "tEXt::Creation Time", creation_time,
-                                 NULL))
-    status = CAIRO_STATUS_SUCCESS;
-  else
-    status = CAIRO_STATUS_WRITE_ERROR;
+  gdk_pixbuf_save_to_stream (pixbuf, stream, "png", NULL, &error,
+                             "tEXt::Software", "gnome-screenshot",
+                             "tEXt::Creation Time", creation_time,
+                             NULL);
 
-  g_task_return_boolean (result, status == CAIRO_STATUS_SUCCESS);
+  if (error)
+    g_task_return_error (result, error);
+  else
+    g_task_return_boolean (result, TRUE);
 }
 
 static void